package com.xfcy.blog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xfcy.blog.dto.ArticleTopDTO;
import com.xfcy.blog.entity.Article;
import com.xfcy.blog.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * 博客文章表(Article)表数据库访问层
 *
 * @author 晓风残月Lx
 * @since 2023-04-09 11:01:24
 */
@Repository
public interface ArticleMapper extends BaseMapper<Article> {

    /**
     * 首页分页获取文章
     * @param page
     * @param publish
     * @param categoryId
     * @param tagId
     * @return
     */
    Page<ArticlePreviewVO> selectPreviewPage(@Param("page") Page page,
                                             @Param("publish") int publish,
                                             @Param("categoryId") Long categoryId,
                                             @Param("tagId") Long tagId);

    /**
     * 根据主键获取文章详情
     * @param id
     * @return
     */
    ArticleInfoVO selectPrimaryKeyById(@Param("id") Long id);

    /**
     * 根据主键获取文章详情
     * @param id
     * @return
     */
    ArticleBackendInfoVO selectPrimaryKey(Long id);

    /**
     * 0 上一篇  1 下一篇
     * @param id
     * @param type
     * @param publish
     * @return
     */
    ArticleVO getNextOrLastArticle(@Param("id") Long id, @Param("type") int type, @Param("publish") int publish);

    /**
     * 推荐的文章
     * @param id 文章id
     * @return
     */
    List<ArticleVO> listRecommendArticles(@Param("id") Long id);

    /**
     * 按热度排毒 同分类 or 同标签 文章
     * @param page
     * @param categoryId
     * @return
     */
    Page<ArticleCategoryVO> selectPageByCategoryId(@Param("page") Page page, @Param("publish") int publish,  @Param("categoryId") Long categoryId, @Param("tagsId") Long tagsId);

    /**
     * 归档查询
     * @param page
     * @return
     */
    Page<ArticleArchiveVO> selectArchivePage(@Param("page") Page page, @Param("publish") Integer publish);

    /**
     * 获取文章贡献度
     * @param lastTime
     * @param nowTime
     * @return
     */
    List<ContributeVO> contribute(@Param("lastTime") String lastTime, @Param("nowTime") String nowTime);

    /**
     * 后台分页获取文章
     * @param page
     * @param map
     * @return
     */
    Page<ArticleListVO> selectListRecord(@Param("page") Page<Object> page, @Param("map") Map<String, Object> map);

    /**
     * 置顶文章或取消置顶
     * @param articleDTO
     */
    void putTopArticle(@Param("articleDTO") ArticleTopDTO articleDTO);

    /**
     * 上架或下架
     * @param articleDTO
     */
    void pubOrShelf(@Param("articleDTO") ArticleTopDTO articleDTO);

    /**
     *
     * @param categoryIds
     */
    void deleteByCategoryId(@Param("categoryIds") List<Long> categoryIds);

    /**
     * 最新文章
     * @param id
     * @param code
     * @return
     */
    List<ArticleVO> getNewArticles(@Param("id") Long id, @Param("code") int code);

}

